#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct Aresta{
    int id;
    int origin,dest;
    float speed;
    float diameter;
    float lenght;
};
typedef struct Aresta Aresta;

struct Vert{
    int id;
    int vizinho[15];
    float press;
    float height;
    float unit;//perda de carga unitária
    float output;
    float coefhazen;
    struct Aresta aresta[15];//supor que não teremos mais que 15 arestar por vértice
};
typedef struct Vert Vert;

int **aloc (int m, int n) {
    int **v;         /* ponteiro para a matriz */
    int i;       /* variavel auxiliar */
    if (m < 1 || n < 1) {    /* verifica parametros recebidos */
        printf ("** Erro: Parametro invalido **\n");
        return (NULL);
    }
    /* aloca as linhas da matriz */
    v = (float **) calloc (m, sizeof(float *));
    if (v == NULL) {
        printf ("** Erro: Memoria Insuficiente **");
        return (NULL);
    }
    /* aloca as colunas da matriz */
    for ( i = 0; i < m; i++ ) {
        v[i] = (float*) calloc (n, sizeof(float));
        if (v[i] == NULL) {
            printf ("** Erro: Memoria Insuficiente **");
        return (NULL);
        }
    }
    return (v);    /* retorna o ponteiro para a matriz */
}

int main() {
    int i,j,k;
    int **matrix;
    int n_vert, n_aresta;
    Vert *vertice;
    Aresta *arestas;
    //devemos entrar com a quantidade de vertices e arestar do programa
    scanf("%d %d\n",&n_vert,&n_aresta);

    matrix = aloc(n_vert, n_aresta);
    vertice =(*Vert) malloc(n_vert*sizeof(Vert));
    arestas = (*Aresta) malloc(n_aresta*sizeof(Aresta));
    //aqui devemos digitar a primeira linha da matrix de incidencia
    //antes de digitarmos a segunda linha devemos colocar as informações
    //sobre o vertice desta linha. Ou seja, digitamos a primeira linha
    // e depois colocamos pressão do vertice 0, altura, perda de carga,
    //vazão e coef de hazen

    for(i=0;i<n_vert;i++){
        for(j=0;j<n_aresta;j++){
            scanf("%d",&matrix[i][j]);
        }
        vertice[i].id = i;
        scanf("%f", &vertice[i].press);
        scanf("%f", &vertice[i].height);
        scanf("%f", &vertice[i].unit);
        scanf("%f", &vertice[i].output);
        scanf("%f", &vertice[i].coefhazen);
    }
    for(j=0;j<n_aresta;j++){
        //Aqui colocamos as informações sobre cada aresta da coluna j
        //da matriz de incidencia
        arestas[j].id = j;
        scanf("%f", arestas[j].speed);
        scanf("%f", arestas[j].diameter);
        scanf("%f", arestas[j].lenght);
        //este for verifica quais são os extremos da aresta
        for(i=0;i<n_vert;i++){
            if(matrix[i][j]==1)
                arestas[j].origin = i;
            else if(matrix[i][j]== -1)
                arestas[j].dest=i;
        }
    }
    //verificar quais arestas estão ligadas a cada vertice
    for(i=0;i<n_vert;i++){
        k=0;
        for(j=0;j<n_aresta;j++){
            if(matrix[i][j] != 0){
                vertice[i].aresta[k]=arestas[j];
                k= k+1;
            }
        }
        vertice[i].aresta[k].origin=-1;//-1 significa que não tem mais arestas
        vertice[i].aresta[k].dest=-1;
    }
    //verificar os vertices adjacentes de cada vértice
    for(i=0;i<n_vert;i++){
        k=0;
        for(j=0;j<n_aresta;j++){
            if(vertice[i].aresta[j].origin == -1)
                break;

             if(vertice[i].aresta[j].origin !=i){
                vertice[i].vizinho[k] = vertice[i].aresta[j].origin;
                k++;
             }
             else{
                 vertice[i].vizinho[k] = vertice[i].aresta[j].dest;
                 k++;
             }
        }
        vertice[i].vizinho[k]=-1;//indica que não tem mais vizinhos
    }
    
    for(i=0;i<n_vert;i++){
        for(j=0;j<n_aresta;j++){
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }

    return (EXIT_SUCCESS);
}

